package woa.queue;

/**
 * 循环队列
 * MyCircularQueue(k): 构造器，设置队列长度为 k 。
 * Front: 从队首获取元素。如果队列为空，返回 -1 。
 * Rear: 获取队尾元素。如果队列为空，返回 -1 。
 * enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
 * deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
 * isEmpty(): 检查循环队列是否为空。
 * isFull(): 检查循环队列是否已满。
 *
 * @author wangpeng
 * @date 2021/11/23
 */
public class MyCircularQueue {

    int[] arr;
    int count;
    int head;
    int tail;

    /**
     * 构造器，设置队列长度为 k 。
     *
     * @param k
     */
    public MyCircularQueue(int k) {
        arr = new int[k];
        count = 0;
        head = 0;
        tail = -1;
    }

    /**
     * 向循环队列插入一个元素。如果成功插入则返回真。
     *
     * @param value
     * @return
     */
    public boolean enQueue(int value) {
        if (arr.length == count) {
            return false;
        }
        ++tail;
        if (tail == arr.length) {
            tail = 0;
        }
        arr[tail] = value;
        count++;
        return true;
    }

    /**
     * 从循环队列中删除一个元素。如果成功删除则返回真。
     *
     * @return
     */
    public boolean deQueue() {
        if (count == 0) {
            return false;
        }

        head++;
        if (head == arr.length) {
            head = 0;
        }
        count--;
        return true;
    }

    /**
     * 从队首获取元素。如果队列为空，返回 -1 。
     *
     * @return
     */
    public int Front() {
        if (count == 0) {
            return -1;
        }

        return arr[head];
    }

    /**
     * 获取队尾元素。如果队列为空，返回 -1 。
     *
     * @return
     */
    public int Rear() {
        if (count == 0) {
            return -1;
        }

        return arr[tail];
    }

    /**
     * 检查循环队列是否为空。
     *
     * @return
     */
    public boolean isEmpty() {
        return count == 0;
    }

    /**
     * 检查循环队列是否已满。
     *
     * @return
     */
    public boolean isFull() {
        return count == arr.length;
    }

    public static void main(String[] args) {
        MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
        System.out.println(circularQueue.enQueue(1)); // 返回 true
        System.out.println(circularQueue.enQueue(2)); // 返回 true
        System.out.println(circularQueue.deQueue()); // 返回 true
        System.out.println(circularQueue.enQueue(3)); // 返回 false，队列已满
        System.out.println(circularQueue.deQueue()); // 返回 true
        System.out.println(circularQueue.enQueue(3)); // 返回 false，队列已满
        System.out.println(circularQueue.deQueue()); // 返回 true
        System.out.println(circularQueue.enQueue(3)); // 返回 false，队列已满
        System.out.println(circularQueue.deQueue()); // 返回 true
        System.out.println(circularQueue.Front()); // 返回 4
    }
}
